"""
@Author  : 吕申凯
@Time    : 2022/9/18 17:48
@File    : __init__.py.py
@Function: batch_normalization
批：一批数据，通常为mini-batch
标准化： 将数据处理成均值为0，方差为 1 的数据

公式：x_bn=(x-mu_x)/(std+eps)
即把数据x减去均值，再除以方差，这样就能把数据变成均值为0，方差为1的数据
其中eps用来防止std为0的时候出现除0的bug

优点：
    1、可以用更大的学习路，加速模型的收敛
    2、可以不用精心设置权值初始化。
        精心设置权值初始化的目的是为了，防止数据的尺度逐渐变大或变小而导致梯度的激增或消失。
        而BN可以将数据尺度规范到一定范围。
    3、可以不用dropout或较小的dropout
    4、可以不用L2或者较小的weight_decay
    5、可以不用LRN(local response normalization)


在BatchNormalization基类中的参数：
    1、num_features: 一个样本的特征数量(最重要)
    2、eps:分母的修正项，通常一个非常小的数，10**-5
    3、momentum：指数加权平均估计当前的mean/var，小于1的正数
        在计算当前mini_batch的均值和方差时，还会根据这个权值加权考虑上一个mini_batch的均值和方差
        即running_mean=(1 - momentum) * pre_running_mean + momentum * cur_mean
        running_var=(1 - momentum) * pre_running_var + momentum * cur_var
    4、affine：bool变量，
        是否需要 affine transform。
        affine transform是将归一化后的数据进行反向恢复。
        x_affine=γ*x+β
        当γ和β等于数据归一化前的方差和均值，则可以将数据恢复成原来的数据
    5、track_running_stats：bool变量
        是训练状态还是测试状态，
        训练状态需要重新计算数据的均值和方差，测试不需要计算
"""
